﻿#define _CRT_SECURE_NO_WARNINGS 1



//#include "unordered_map.h"
//using my_um::unordered_map;

//#include "unordered_set.h"
//using my_us::unordered_set;
//
//#include <string>
//using std::string;
//using std::cout;
//using std::endl;
//
//
//void test1()
//{
//	unordered_map<int, int> m1;
//	int a[] = { 2,3,33,13,5,12,1002,1002 };
//	for (const auto& i : a)
//	{
//		m1.insert(make_pair(i, 0));
//	}
//	unordered_map<int, int> m2;
//	int b[] = { 1,2,3,4,5,6,7,8,9 };
//	for (const auto& i : b)
//	{
//		m2.insert(make_pair(i, 0));
//	}
//	m1.swap(m2);
//}
//
//void test2()
//{
//	string s[] = { "123","456","789" };
//	unordered_map<string, int> m;
//	for (const auto& n : s)
//	{
//		m.insert(make_pair(n, 0));
//	}
//	auto x = m.find("456");
//}
//
//void test3()
//{
//	unordered_map<int, int> m1;
//	int a[] = { 2,3,33,13,5,12,1002,1002,1,2,3,4,5,6,7,8,9 };
//	for (const auto& i : a)
//	{
//		m1.insert(make_pair(i, 0));
//	}
//	unordered_map<int, int> m;
//	unordered_map<int, int> m2;
//	m2 = m = m1;
//	unordered_map<int, int>::iterator x = m.begin();
//	while (x != m.end())
//	//for(const auto& x:m1)
//	{
//		cout << (*x).first << ":" << (*x).second << endl;
//		++x;
//	}
//}
//
//void test4()
//{
//	unordered_map<int, int> m;
//
//	int a[] = { 2,3,33,13,5,12,1002,1002,1,2,3,4,5,6,7,8,9 };
//	for (const auto& i : a)
//	{
//		m.insert(make_pair(i, 0));
//	}
//	unordered_map<int, int>::iterator it1 = m.begin();
//	while (it1 != m.end())
//	{
//		cout << (*it1).first << ":" << (*it1).second << endl;
//		//(*it1).first = 10;
//		(*it1).second = 1;
//		++it1;
//	}
//
//	unordered_map<int, int>::const_iterator it2 = m.cbegin();
//	while (it2 != m.cend())
//	{
//		cout << (*it2).first << ":" << (*it2).second << endl;
//		//(*it2).first = 10;
//		//(*it2).second = 1;
//		++it2;
//	}
//}
//void test5()
//{
//	unordered_map<int, int> m;
//	int a[] = { 2,3,33,13,5,12,1002,1002,1,2,3,4,5,6,7,8,9 };
//	for (const auto& i : a)
//	{
//		++m[i];
//	}
//
//	for (const auto& x : m)
//	{
//		cout << x.first << ":" << x.second << endl;
//	}
//	cout << endl << endl;
//
//	unordered_map<int, int>::iterator it = m.begin();
//
//	while (it != m.end())
//	{
//		it = m.erase(it);
//	}
//
//	for (const auto& x : m)
//	{
//		cout << x.first << ":" << x.second << endl;
//	}
//}
//
//void test6()
//{
//	unordered_map<int, int> m;
//	int a[] = { 2,3,33,13,5,12,1002,1002,1,2,3,4,5,6,7,8,9 };
//	for (const auto& i : a)
//	{
//		++m[i];
//	}
//
//	for (const auto& x : m)
//	{
//		cout << x.first << ":" << x.second << endl;
//	}
//	cout << endl << endl;
//
//	unordered_map<int, int>::iterator it = m.begin();
//	
//	++it;
//	++it;
//	++it;
//	++it;
//
//	m.erase(m.begin(), it);
//
//	for (const auto& x : m)
//	{
//		cout << x.first << ":" << x.second << endl;
//	}
//}
//
//#include "unordered_set.h"
//using my_us::unordered_set;
//
//void test7()
//{
//	unordered_set<int> s;
//	s.insert(1);
//	s.insert(2);
//	s.insert(3);
//	s.insert(4);
//	s.insert(5);
//
//	unordered_set<int>::const_iterator it = s.cbegin();
//	while (it != s.cend())
//	{
//		cout << *it << endl;
//		++it;
//	}
//
//	//for (const auto& x : s)
//	//{
//	//	cout << x << endl;
//	//}
//}
//
//void test8()
//{
//	//string arr[] = { "", "", "ƻ", "", "ƻ", "ƻ", "", "ƻ", "㽶", "ƻ", "㽶", "" };
//	std::string arr[] = { "西瓜", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉", "梨" };
//	unordered_map<string, int> countMap;
//	for (auto& e : arr)
//	{
//		countMap[e]++;
//	}
//
//	for (auto& kv : countMap)
//	{
//		cout << kv.first << ":" << kv.second << endl;
//	}
//}
//
//void test9()
//{
//	//string arr[] = { "", "", "ƻ", "", "ƻ", "ƻ", "", "ƻ", "㽶", "ƻ", "㽶", "" };
//	std::string arr[] = { "西瓜", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉", "梨" };
//	unordered_set<string> countSet;
//	for (auto& e : arr)
//	{
//		countSet.insert(e);
//	}
//
//	for (auto& k : countSet)
//	{
//		cout << k << endl;
//	}
//}

//void test10()
//{
//	std::string arr[] = { "西瓜", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜", "苹果", "香蕉", "苹果", "香蕉", "梨" };
//	unordered_set<string> s;
//	for (const auto& x : arr)
//	{
//		s.insert(x);
//	}
//	unordered_set<string>::const_iterator it = s.cbegin();
//	while (it != s.cend())
//	{
//		cout << *it << endl;
//		++it;
//	}
//}

#include "Hash.h"
using My_Open_Hash::Open_Hash;

template<class K>
struct KV
{
	K operator()(const K& key)
	{
		return key;
	}
};

void test11()
{
	Open_Hash<int, int,HashKey<int>, KV<int>,EqualsKey<int>> x;
	srand(time(nullptr));
	int n = 10000000;
	for (int i = 0; i < n; ++i)
	{
		x.insert(rand()%(n*10)+i);
	}
	x.Depth();
}

int main()
{
	test11();
	return 0;
}